Clip to cell_area when rendering cell content
authorKristian Rietveld <kris@gtk.org>
Wed, 15 Dec 2010 23:07:08 +0000 (00:07 +0100)
committerKristian Rietveld <kris@gtk.org>
Wed, 15 Dec 2010 23:07:08 +0000 (00:07 +0100)
This fixes a GTK+ 3.0 regression.  In GTK+ 2, the render method
on GtkCellRenderer had a expose_area parameter, typically set to
cell_area.  This parameter was used for clipping cell content to be
rendered to the cell area (and thus clipping to within the focus
rectangle).  During the rendering clean up this parameter was removed
and no clipping put back into place.

Since expose_area was usually equal to cell_area anyway, it does not make
sense to reintroduce the expose_area parameter.  Instead, we do clipping at
two levels:
 - in gtk_cell_renderer_render() we clip to background_area.  We cannot
clip to cell_area here because we want to allow cell renderers to
render in the background area (e.g. background color/effect).
 - cell renderers should clip to clip_area when rendering cell
content individually (as they had to individually clip to expose_region
before).

gtk/gtkcellrenderer.c
gtk/gtkcellrendererspinner.c
gtk/gtkcellrenderertext.c
gtk/gtkcellrenderertoggle.c

index a60b8885cc4a85c905b82ecad319c0da7be9569f..e15323e830dca563d83db831cb71b179abb56b36 100644 (file)
@@ -698,6 +698,9 @@ gtk_cell_renderer_render (GtkCellRenderer      *cell,
       cairo_fill (cr);
     }
 
+  gdk_cairo_rectangle (cr, background_area);
+  cairo_clip (cr);
+
   GTK_CELL_RENDERER_GET_CLASS (cell)->render (cell,
                                               cr,
                                              widget,
index 5d50f8dfdd0212ce915fc2fe1b861c8b94926bc1..bc63b5ea90c0fc5fbbc2ad71efcd2991d50157cf 100644 (file)
@@ -372,6 +372,11 @@ gtk_cell_renderer_spinner_render (GtkCellRenderer      *cellr,
         state = GTK_STATE_PRELIGHT;
     }
 
+  cairo_save (cr);
+
+  gdk_cairo_rectangle (cr, cell_area);
+  cairo_clip (cr);
+
   gtk_paint_spinner (gtk_widget_get_style (widget),
                            cr,
                            state,
@@ -380,4 +385,6 @@ gtk_cell_renderer_spinner_render (GtkCellRenderer      *cellr,
                            priv->pulse,
                            draw_rect.x, draw_rect.y,
                            draw_rect.width, draw_rect.height);
+
+  cairo_restore (cr);
 }
index a61e8c6ea6af8695ee1b01999e05fb08e481b2f0..2cff3a47c3863c675702e155c572d4ebed19823a 100644 (file)
@@ -1833,6 +1833,11 @@ gtk_cell_renderer_text_render (GtkCellRenderer      *cell,
   else if (priv->wrap_width == -1)
     pango_layout_set_width (layout, -1);
 
+  cairo_save (cr);
+
+  gdk_cairo_rectangle (cr, cell_area);
+  cairo_clip (cr);
+
   gtk_paint_layout (gtk_widget_get_style (widget),
                           cr,
                           state,
@@ -1843,6 +1848,8 @@ gtk_cell_renderer_text_render (GtkCellRenderer      *cell,
                           cell_area->y + y_offset + ypad,
                           layout);
 
+  cairo_restore (cr);
+
   g_object_unref (layout);
 }
 
index e1aa78e03fa82a69259081c638790a8dc8160b6b..177cafd32ab63e9fee364ea157f2b8d14d2f99d3 100644 (file)
@@ -372,6 +372,11 @@ gtk_cell_renderer_toggle_render (GtkCellRenderer      *cell,
         state = GTK_STATE_INSENSITIVE;
     }
 
+  cairo_save (cr);
+
+  gdk_cairo_rectangle (cr, cell_area);
+  cairo_clip (cr);
+
   if (priv->radio)
     {
       gtk_paint_option (gtk_widget_get_style (widget),
@@ -392,6 +397,8 @@ gtk_cell_renderer_toggle_render (GtkCellRenderer      *cell,
                              cell_area->y + y_offset + ypad,
                              width, height);
     }
+
+  cairo_restore (cr);
 }
 
 static gint